'''
2.正则表达式的作用和特点
    给定一个正则表达式和另一个字符串，我们可以达到如下的目的:
    1.给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”
    2.可以通过正则表达式，从字符串中获取我们想要的特定部分
正则表达式的特点是:
    1.灵活性、逻辑性和功能性非常强;
    2.可以迅速地用极简单的方式达到字符串的复杂控制。
    3.对于刚接触的人来说，比较晦涩难懂。

\A:表示从字符串的开始处匹配
\Z:表示从字符串的结束处匹配，如果存在换行，只匹配到换行前的结束字符串
\b:匹配一个单词边界，也就是指单词和空格间的位置
\B：匹配非单词边界。
\d：匹配任意数字，等价于[0-9]。
\D:匹配任意非数字字符，等价于[^\d]。
\s:匹配任意空白字符，等价于[\t\n\r\f]。
\S:匹配任意非空白字符，等价于 [`\s]。
\w:匹配字母、数字及下划线，等价于[a-zA-Z0-9_]。
\W:匹配非字母、数字及下划线，等价于[`\w]。

'.'用于匹配除换行符(\n)之外的所有字符。
'^'用于匹配字符串的开始，即行首。
'$’用于匹配字符串的末尾(末尾如果有换行符\n，就匹配\n前面的那个字符)，即行尾。
正则验证次数：
'*’用于将前面的模式匹配0次或多次(贪婪模式，即尽可能多的匹配)
'+’用于将前面的模式匹配1次或多次(贪婪模式) >=1
'?’用于将前面的模式匹配0次或1次(贪婪模式)
'*?，+?，??’即上面三种特殊字符的非贪婪模式(尽可能少的匹配)。
'{m,n}’用于将前面的模式匹配m次到n次(贪婪模式)，即最小匹配m次，最大匹配n次。
'{m,n}?’即上面'{m,n}’的非贪婪版本。

’\\’、是转义字符，在特殊字符前面加上\，特殊字符就失去了其所代表的含义，比如\+就仅仅代表加号+本身。
'[]’用于标示一组字符，如果^是第一个字符，则标示的是一个补集。比如[0-9]表示所有的数字，[^0-9]表示除了数字外的字符。
'|'比如A|B用于匹配A或B。
'(...)’用于匹配括号中的模式，可以在字符串中检索或匹配我们所需要的内容
'''
# qq = input("请输入QQ号码：")
# if len(qq) >= 5 and qq[0] != '0':
#     print('输入的QQ号码是合法的')
# else:
#     print('输入的QQ号码不合法')

import re

msg = '张三李四王五'

pettern = re.compile('王五') # None
result = pettern.match(msg) # 匹配开头
print(result)

pettern = re.compile('张三') # <re.Match object; span=(0, 2), match='张三'>
result = pettern.match(msg) # 匹配开头
print(result)

# 使用正则re模块方法：match
s = '张三李四王五赵六'
result = re.match('张三', s) # 匹配开头,如果开头不是张三，则返回None
print(result)

result = re.search('赵六', s) # 匹配整个字符串，返回第一个匹配项
print(result)

print(result.span()) # 起始位置，结束位置
print(result.group()) # 匹配到的内容
print(result.groups())
print('-----------------------------------')

msg = 'abcd3ifo1ih098'
result = re.findall('[a-z][0-9][a-z]', msg) # 匹配所有符合条件的内容
print(result)

s = '好好6a'
result = re.search('[12345]',s)
print(result)

result = re.search('[0-9][a-z]',s) # search 只要匹配到，后面的就不进行检索
print(result.group()) # 匹配到的内容

#qq号码验证5~11 开头不能是0
qq = '2246938595'
result = re.match('^[1-9][0-9]{4,10}$', qq)
print(result)

#用户名可以是字母或者数字，不能是数字开头，用户名长度必须6位以上[0-9a-zA-Z]
username = 'zhangsan001'
result = re.match('^[a-zA-Z][0-9a-zA-Z]{5,}$', username)
print(result)

mag = 'aa.py ab.text cc.png dd.py'
result = re.findall(r'\w*\.py\b', mag) # findall 匹配所有符合条件的内容，检索到最后
print(result)
'''
. 匹配除换行符\n之外的任何单个字符。
^ 匹配字符串的开头。
$ 匹配字符串的结尾。
[] 范围

\s 空格
\b 单词边界
\d 数字
\w 字母数字下划线
大写反面 \S 非空格 \B 非单词边界 \D 非数字 \W 非字母数字下划线
'\w[0-9]' --> 匹配字母数字下划线开头，后面跟着数字的单词

手机号码正则
re.match('1[35789]\d{9}$', phone)
{m}:固定m位
{m,}:m位以上  [)
{m,n}:m到n位  []
'''